#include <signal.h>
#include <iostream>
#include <sys/types.h>
#include <unistd.h>

void PrintPending(sigset_t&pending)
{
    printf("我是一个进程(%d)我的pending:",getpid());
    for(int i=31;i>=1;i--)
    {
        std::cout<<sigismember(&pending,i);
    }
    std::cout<<std::endl;
}

void handler(int n)
{
    printf("%d信号已递达\n",n);
}

int main()
{
    signal(SIGINT,handler);

    sigset_t block,oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);

    //将2号信号屏蔽
    sigaddset(&block,SIGINT);
    //覆盖内核阻塞信号集
    sigprocmask(SIG_SETMASK,&block,&oblock);
    int cnt=0;
    while(true)
    {
        //获取pending信号集
        sigset_t pending;
        sigpending(&pending);
        //打印pending
        PrintPending(pending);
        if(cnt==10)
        {
            //恢复2号信号的block情况
            std::cout<<"解除对2号信号的屏蔽"<<std::endl;
            sigprocmask(SIG_SETMASK,&oblock,nullptr);
        }
        sleep(1);
        cnt++;
    }

    return 0;
}
